﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using log4net;
using Iudicium.Seguridad;
using System.Text;
using Iudicium.Utilitarios;

public partial class Seguridad_Roles_FormularioRol : System.Web.UI.Page
{
    private static readonly ILog log = LogManager.GetLogger("LogFile");

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ObtenerParametros();
        }
        NombreRolTextBox.Focus();
    }

    private void ObtenerParametros()
    {
        if (Session["RolId"] != null && !string.IsNullOrEmpty(Session["RolId"].ToString()))
        {
            RolIdHiddenField.Value = Session["RolId"].ToString();
            Session["RolId"] = null;
            CargarDatos();
        }
    }

    private void CargarDatos()
    {
        int rolId = 0;
        try
        {
            rolId = Convert.ToInt32(RolIdHiddenField.Value);
        }
        catch (Exception ex)
        {
            log.Error("No se pudo convertir el valor de RolIdHiddenField.Value a un valor entero", ex);
        }

        if (rolId <= 0)
            return;
        Rol rol = null;
        try
        {
            rol = Iudicium.Seguridad.CRN.RolCRN.GetRolById(rolId);
        }
        catch (Exception ex)
        {
            log.Error("No se pudo obtener el Rol de la base de datos", ex);
            Notificacion.MostrarNotificacion("Ocurrio un error al tratar obtener el Rol a editar", Notificacion.TipoNotificacion.Error);
            ControlNotificacion.Update();
        }

        if (rol == null)
            return;

        NombreRolTextBox.Text = rol.NombreRol;
        ActivoRadioButton.Checked = rol.Estado == Rol.EstadoRol.Activo;
        InactivoRadioButton.Checked = rol.Estado == Rol.EstadoRol.Inactivo;
        PermisosRepeater.DataBind();
    }

    protected void GuardarLinkButton_Click(object sender, EventArgs e)
    {
        int rolId = 0;
        try
        {
            rolId = Convert.ToInt32(RolIdHiddenField.Value);
        }
        catch (Exception ex)
        {
            log.Error("No se pudo convertir el valor de RolIdHiddenField.Value a un valor entero", ex);
        }

        string nombreRol = NombreRolTextBox.Text;
        Rol.EstadoRol estado = ActivoRadioButton.Checked ? Rol.EstadoRol.Activo : Rol.EstadoRol.Inactivo;
        StringBuilder strPermisos = new StringBuilder();
        foreach (RepeaterItem item in PermisosRepeater.Items)
        {
            try
            {
                CheckBox chk = (CheckBox)item.FindControl("TienePermisoCheckBox");
                HiddenField permisoIdHiddenField = (HiddenField)item.FindControl("PermisoIdHiddenField");
                if (chk.Checked)
                    strPermisos.Append(permisoIdHiddenField.Value).Append(",");
            }
            catch (Exception ex)
            {
                log.Error("No se pudo obtener el checkbox del repeater de permisos", ex);
            }
        }

        string permisos = strPermisos.ToString();
        if (permisos.Length > 0)
            permisos = permisos.Substring(0, permisos.Length - 1);

        Rol objRol = new Rol(rolId, nombreRol, estado, permisos);
        if (rolId == 0)
        {
            try
            {
                Iudicium.Seguridad.CRN.RolCRN.InsertRol(objRol);
                Notificacion.MostrarNotificacion("El nuevo Rol ha sido creado", Notificacion.TipoNotificacion.Alert);
            }
            catch (Exception ex)
            {
                log.Error("No se pudo insertar el nuevo rol", ex);
                Notificacion.MostrarNotificacion("Ocurrio un error al tratar guardar el Nuevo Rol", Notificacion.TipoNotificacion.Error);
                ControlNotificacion.Update();
                return;
            }

        }
        else
        {
            try
            {
                Iudicium.Seguridad.CRN.RolCRN.UpdateRol(objRol);
                Notificacion.MostrarNotificacion("Los datos del Rol han sido actualizados", Notificacion.TipoNotificacion.Alert);
            }
            catch (Exception ex)
            {
                log.Error("No se pudo actualizar el rol con id " + rolId, ex);
                Notificacion.MostrarNotificacion("Ocurrio un error al tratar de editar los datos del Rol", Notificacion.TipoNotificacion.Error);
                ControlNotificacion.Update();
                return;
            }
            
        }

        Response.Redirect("~/Seguridad/Roles/ListaRoles.aspx", true);
    }

    protected void PermisosObjectDataSource_Selected(object sender, ObjectDataSourceStatusEventArgs e)
    {
        if (e.Exception != null)
        {
            log.Error("Ocurrio un error al Obtener los permisos del rol " + RolIdHiddenField.Value, e.Exception);
            e.ExceptionHandled = true;
        }
    }
}
